package AgentesConcurso;

import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;

import Ontologias.PredicadoConcurso;
import Ontologias.PredicadoProposta;

import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
import jade.wrapper.AgentController;
import jade.wrapper.ContainerController;
import jade.wrapper.StaleProxyException;


// SUBSTITUIR POR CYCLIC BEHAVIOUR

@SuppressWarnings("serial")
public class PrazoRenegoceio extends CyclicBehaviour {

	private static int TEMPO_REN_MAX = 19000;
	
	private AgenteDecisor agente;
	private PredicadoConcurso pConc;
	private List<PredicadoProposta> l_pProp;
	
	private GregorianCalendar inicio;

	public PrazoRenegoceio (AgenteDecisor agente, PredicadoConcurso pConc) {
		super(agente);
		l_pProp = new LinkedList<PredicadoProposta>();
		this.pConc = pConc;
		this.agente = agente;
		this.inicio = new GregorianCalendar();
	}



	@Override
	public void action() {

		boolean acaba = false;
		GregorianCalendar agora = new GregorianCalendar();
		
		
		if ((agora.getTimeInMillis() - inicio.getTimeInMillis()) < TEMPO_REN_MAX) {
			ACLMessage msg= myAgent.receive();

			PredicadoProposta predPropostas; 
			if (msg!=null) {
				if ((msg.getContent() != null) && (msg.getPerformative() == ACLMessage.PROPOSE)){
					try {
						predPropostas =(PredicadoProposta) msg.getContentObject();
						if(predPropostas.getNomeConcurso().equals(pConc.getNome()) && predPropostas.getDataInicioConcurso().getTimeInMillis()==pConc.getData_inicio().getTimeInMillis()); {
							this.l_pProp.add(predPropostas);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			} else {
			}
		} else {
			acaba = true;
		}
		
		if (acaba) {
			createAgent(l_pProp);				
			myAgent.removeBehaviour(this);
			
			
		}

		block(5000);

	}




	private void createAgent(List<PredicadoProposta> l_pProp) {

		
		ContainerController cc;
		AgentController ac;


		Object[] args_list = new Object[l_pProp.size()+3];
		args_list[0] = this.agente;
		args_list[1] = pConc;

		int i = 2;

		for(PredicadoProposta pp : l_pProp) {
			args_list[i] = pp;
			i++;
		}

		args_list[i] = null;


		cc = agente.getContainerController();
		try {
			ac = cc.createNewAgent(pConc.getNome() + (new GregorianCalendar()).getTimeInMillis() + "_rece_proposta", "AgentesClassificadores.AgenteReceptorProposta", args_list);
			ac.start();
		} catch (StaleProxyException e) {
			e.printStackTrace();
		}

	}














}
